Published on

UE 中的旋转:FRotator 和 FQuat

Authors
  • avatar
    Name
    Zihan Li
    Twitter

FRotator 和 FQuat 是 Unreal Engine 中用于表示旋转的两种不同的数据结构,它们各自有不同的特性和用法。

FRotator

定义与结构
FRotator 是一种使用欧拉角表示旋转的结构,包含三个分量:

  • Pitch(俯仰角):绕 Y 轴旋转。
  • Yaw(偏航角):绕 Z 轴旋转。
  • Roll(滚转角):绕 X 轴旋转。

FRotator 的构造函数示例:

FRotator rotator(0, 10, 0); // 绕 Z 轴旋转 10 度

这种方式直观易懂,但在某些情况下可能会导致万向节锁(gimbal lock)问题,即在某些旋转组合下,失去一个自由度。

转换与应用
FRotator 可以轻松地与其他类型的旋转表示进行转换,例如转换为四元数:

FQuat MyQuat = MyRotator.Quaternion();

FQuat

定义与结构
FQuat 是基于四元数的旋转表示,四元数是一种更复杂的数学结构,通常由一个单位向量和一个旋转角度组成。它不使用度数,而是通过四个分量(x, y, z, w)来表示旋转。

四元数的构造示例:

FQuat quat = FQuat(FVector(0, 0, 1), PI / 4.f); // 绕 Z 轴旋转 45 度

FQuat 的优点在于它不会受到万向节锁的影响,并且在插值和平滑旋转时表现更好。

转换与应用
FQuat 可以通过欧拉角创建:

FVector vec = FVector(0, 0, 45);
FQuat quat = FQuat::MakeFromEuler(vec);

同样,FQuat 可以转换回 FRotator:

FRotator MyRotator(MyQuat); // 使用 FRotator 的构造函数

总结

  • FRotator 使用欧拉角(Pitch, Yaw, Roll)表示,适合简单的旋转需求,但可能会遇到万向节锁问题。
  • FQuat 使用四元数表示,适合复杂和连续的旋转操作,避免了万向节锁,并提供更平滑的插值效果。

在实际开发中,选择使用哪种结构通常取决于具体的应用场景和需求。

Citations: [1] https://juejin.cn/post/7076751832298553358 [2] https://juejin.cn/post/7075379926345449479 [3] https://forums.unrealengine.com/t/unreal-whats-the-difference-between-frotator-and-fquat/382191 [4] https://www.bilibili.com/read/cv5561929/ [5] https://blog.csdn.net/baidu_28938713/article/details/78550726 [6] https://blog.csdn.net/invgihfsvf/article/details/118335670 [7] https://blog.csdn.net/ChaoChao66666/article/details/127245214 [8] https://www.bilibili.com/read/cv5578526/ [9] https://blog.csdn.net/mrbaolong/article/details/112547972 [10] https://www.cnblogs.com/sevenyuan/p/11848576.html